package online.longzipeng.mywebdemo.mq.producer;

import cn.hutool.json.JSONUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: lzp
 * @Description:简单模式生产者
 * @Date: 2024/1/10 10:31
 */
@RestController
@RequestMapping(value = "/rabbitmq")
@Api(tags = "mq测试")
public class MqProducer {

	@Autowired
	RabbitTemplate rabbitTemplate;  //使用RabbitTemplate,这提供了接收/发送等等方法

	/**
	 * 简单模式发送消息
	 */
	@GetMapping(value = "/simple/sendMsg")
	@ApiOperation("简单模式发送消息")
	public String sendSimple(String messageId,String messageData) {
		SimpleDateFormat simpleDateFormat  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String createTime = simpleDateFormat.format(new Date());
		Map<String,Object> map=new HashMap<>();
		map.put("messageId",messageId);
		map.put("messageData",messageData);
		map.put("createTime",createTime);
		//将消息发送到队列my_queue中
		rabbitTemplate.convertAndSend("my_queue", JSONUtil.toJsonStr(map));
		// 对应类型数据，对应入参的处理方法能够分别消费消息
//		rabbitTemplate.convertAndSend("my_queue", map);
//		rabbitTemplate.convertAndSend("my_queue", messageData);
		//receive将接收到消息
		System.out.println("rabbitMQ 简单模式消息发送成功！");
		return "true";
	}

	/**
	 * 工作模式发送消息
	 */
	@GetMapping(value = "/work/sendMsg")
	@ApiOperation("工作模式发送消息")
	public String sendWork(String messageId,String messageData) {
		SimpleDateFormat simpleDateFormat  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String createTime = simpleDateFormat.format(new Date());
		Map<String,Object> map=new HashMap<>();
		map.put("messageId",messageId);
		map.put("messageData",messageData);
		map.put("createTime",createTime);
		//将消息发送到队列my_queue中
		rabbitTemplate.convertAndSend("work_queue", JSONUtil.toJsonStr(map));
		// 对应类型数据，对应入参的处理方法能够分别消费消息
		//receive将接收到消息
		System.out.println("rabbitMQ 工作模式消息发送成功！");
		return "true";
	}

	/**
	 * 广播模式发送消息
	 */
	@GetMapping(value = "/fanout/sendMsg")
	@ApiOperation("广播模式发送消息")
	public String sendFanout(String messageId,String messageData) {
		SimpleDateFormat simpleDateFormat  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String createTime = simpleDateFormat.format(new Date());
		Map<String,Object> map=new HashMap<>();
		map.put("messageId",messageId);
		map.put("messageData",messageData);
		map.put("createTime",createTime);
		//将消息发送到扇形交换机，交换机将消息广播出去，该模式下 routeKey任意值都不会生效，故直接置空
		rabbitTemplate.convertAndSend("fanout_exchange",null, JSONUtil.toJsonStr(map));
		// 对应类型数据，对应入参的处理方法能够分别消费消息
		//receive将接收到消息
		System.out.println("rabbitMQ 广播模式消息发送成功！");
		return "true";
	}

	/**
	 * 发布订阅-直连模式模式发送消息
	 */
	@GetMapping(value = "/direct/sendMsg")
	@ApiOperation("直连模式发送消息")
	public String sendDirect(String messageId,String messageData,String routeKey) {
		SimpleDateFormat simpleDateFormat  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String createTime = simpleDateFormat.format(new Date());
		Map<String,Object> map=new HashMap<>();
		map.put("messageId",messageId);
		map.put("messageData",messageData);
		map.put("createTime",createTime);
		//将消息发送到扇形交换机，交换机按照消费者队列绑定的routKey决定转发到哪个消费队列
		rabbitTemplate.convertAndSend("direct_exchange",routeKey, JSONUtil.toJsonStr(map));
		// 对应类型数据，对应入参的处理方法能够分别消费消息
		//receive将接收到消息
		System.out.println("rabbitMQ 发布订阅 直连模式消息发送成功！");
		return "true";
	}

	/**
	 * 发布订阅-主题模式模式发送消息
	 */
	@GetMapping(value = "/topic/sendMsg")
	@ApiOperation("主题模式发送消息")
	public String sendTopic(String messageId,String messageData,String routeKey) {
		SimpleDateFormat simpleDateFormat  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String createTime = simpleDateFormat.format(new Date());
		Map<String,Object> map=new HashMap<>();
		map.put("messageId",messageId);
		map.put("messageData",messageData);
		map.put("createTime",createTime);
		//将消息发送到扇形交换机，交换机按照消费者队列绑定的routKey的规则决定转发到哪个消费队列
		rabbitTemplate.convertAndSend("topic_exchange",routeKey, JSONUtil.toJsonStr(map));
		// 对应类型数据，对应入参的处理方法能够分别消费消息
		//receive将接收到消息
		System.out.println("rabbitMQ 发布订阅 主题模式消息发送成功！");
		return "true";
	}

}